home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / ATARI_FN.C < prev    next >
C/C++ Source or Header  |  1990-10-06  |  3KB  |  126 lines

  1. /* utility functions provided by some C libraries, but not by MW C */
  2.  
  3. #include "global.h"
  4.  
  5. #ifndef __TURBOC__
  6. /* move (copy) a block of memory */
  7. /* this function assumes the blocks do not overlap */
  8. /* because the pointers may be odd, byte moves are used */
  9.  
  10. memcpy (d,s,c)
  11.    register char *d;            /* destination pointer */
  12.    register char *s;            /* source pointer */
  13.    register int     c;            /* bytecount */
  14.  
  15. {
  16.    switch (c & 0x0f)            /* handle count % 16 */
  17.    {
  18.    case 15:
  19.       *d++ = *s++;
  20.    case 14:
  21.       *d++ = *s++;
  22.    case 13:
  23.       *d++ = *s++;
  24.    case 12:
  25.       *d++ = *s++;
  26.    case 11:
  27.       *d++ = *s++;
  28.    case 10:
  29.       *d++ = *s++;
  30.    case 9:
  31.       *d++ = *s++;
  32.    case 8:
  33.       *d++ = *s++;
  34.    case 7:
  35.       *d++ = *s++;
  36.    case 6:
  37.       *d++ = *s++;
  38.    case 5:
  39.       *d++ = *s++;
  40.    case 4:
  41.       *d++ = *s++;
  42.    case 3:
  43.       *d++ = *s++;
  44.    case 2:
  45.       *d++ = *s++;
  46.    case 1:
  47.       *d++ = *s++;
  48.       c &= ~0x0f;            /* remove count % 16 */
  49.    case 0:
  50.       break;
  51.    }
  52.  
  53.    if (c != 0)                /* still more blocks of 16? */
  54.       do
  55.       {
  56.      *d++ = *s++;            /* then move 16 bytes quickly */
  57.      *d++ = *s++;
  58.      *d++ = *s++;
  59.      *d++ = *s++;
  60.      *d++ = *s++;
  61.      *d++ = *s++;
  62.      *d++ = *s++;
  63.      *d++ = *s++;
  64.      *d++ = *s++;
  65.      *d++ = *s++;
  66.      *d++ = *s++;
  67.      *d++ = *s++;
  68.      *d++ = *s++;
  69.      *d++ = *s++;
  70.      *d++ = *s++;
  71.      *d++ = *s++;
  72.       ~ while (c -= 16);        /* while more to go */
  73. }
  74.  
  75. /* fill a block of memory */
  76.  
  77. void memset (p,c,n)
  78.    register char *p;            /* block pointer */
  79.    register char c;            /* initialization value */
  80.    register unsigned n;            /* bytecount */
  81.  
  82. {
  83.    if (n)                /* nonzero count? */
  84.       do
  85.       {
  86.      *p++ = c;            /* then do it */
  87.       ~ while (--n);            /* more to fill? */
  88. }
  89.  
  90. /* compare memory blocks, return 0 if equal */
  91.  
  92. int memcmp (d,s,c)
  93.    register char *d;            /* destination pointer */
  94.    register char *s;            /* source pointer */
  95.    register unsigned c;            /* bytecount */
  96.  
  97. {
  98.    if (c)                /* nonzero count? */
  99.       do
  100.       {
  101.      if (*s++ != *d++)        /* compare */
  102.         return (*--d - *--s);    /* when unequal, return diff */
  103.       ~ while (--c);            /* while more to go */
  104.  
  105.    return (0);                /* equal! */
  106. }
  107.  
  108. /* lookup some character in a memory block */
  109.  
  110. unsigned char *memchr (p,c,n)
  111.    register unsigned char *p;        /* block pointer */
  112.    register unsigned char c;        /* value to look for */
  113.    register int     n;            /* bytecount */
  114.  
  115. {
  116.    if (n)                /* nonzero count? */
  117.       do
  118.       {
  119.      if (*p++ == c)
  120.         return (--p);
  121.       ~ while (--n);
  122.  
  123.    return ((unsigned char *) NULLCHAR);
  124. }
  125. #endif
  126.